package br.unirio.octopus.util;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import br.unirio.octopus.dominio.ClassificacaoPaisDTO;
import br.unirio.octopus.dominio.GrupoDTO;
import br.unirio.octopus.dominio.Jogo;

public class GeradorDeClassificacaoDeFaseDeGrupos {
	
	private Map<Integer, ClassificacaoPaisDTO> paises;
	private Map<Integer, GrupoDTO> grupos;
	

	public GeradorDeClassificacaoDeFaseDeGrupos(){
		paises = new HashMap<Integer, ClassificacaoPaisDTO>();
		grupos = new HashMap<Integer, GrupoDTO>();
	}

	public List<GrupoDTO> fecharFase(List<Jogo> obterJogosDaFase) 
	{
		if (obterJogosDaFase == null)
		{
			return null;
		}
		for (Jogo jogo : obterJogosDaFase)
		{
			adicionarMapPais(jogo);
		}
		
		Collection<ClassificacaoPaisDTO> colecao = paises.values();
		if (colecao == null)
		{
			return null;
		}
		for (ClassificacaoPaisDTO dto : colecao)
		{			
			adicionarMapGrupo(dto);
		}
		List<GrupoDTO> retorno = new ArrayList<GrupoDTO>();
		
		for (Integer longKey : grupos.keySet()) {
			retorno.add(grupos.get(longKey));
		}
		
		return retorno;

		
	}
	
	private void adicionarMapGrupo(ClassificacaoPaisDTO pais)
	{
		GrupoDTO dto = grupos.get(pais.getNumeroGrupo());
		if (dto == null)
		{
			dto = new GrupoDTO(pais.getNumeroGrupo());
			dto.adicionar(pais);
			grupos.put(pais.getNumeroGrupo(), dto);
		}
		else
		{
			dto.adicionar(pais);
		}		
	}

	private void adicionarMapPais(Jogo jogo) 
	{
		ClassificacaoPaisDTO dto = paises.get(jogo.getPais1().getIdDoPais());
		if (dto == null)
		{
			dto = new ClassificacaoPaisDTO(jogo.getPais1().getIdDoPais());
			dto.adicionar(jogo);
			paises.put(jogo.getPais1().getIdDoPais(), dto);
		}
		else
		{
			dto.adicionar(jogo);
			paises.put(jogo.getPais1().getIdDoPais(), dto);
		}
		
		dto = paises.get(jogo.getPais2().getIdDoPais());
		if (dto == null)
		{
			dto = new ClassificacaoPaisDTO(jogo.getPais2().getIdDoPais());
			dto.adicionar(jogo);
			paises.put(jogo.getPais2().getIdDoPais(), dto);
		}
		else
		{
			dto.adicionar(jogo);
			paises.put(jogo.getPais2().getIdDoPais(), dto);
		}
	}
}
